/*
 * AbstractSQLPaginaDAO.java
 *
 * Created on 8 de noviembre de 2007, 15:59
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package webportlet.model.pagina.dao;

import java.sql.Array;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import webportlet.model.pagina.dto.PaginaDTO;
import webportlet.model.util.InstanceNotFoundException;
import webportlet.model.util.InternalErrorException;
import webportlet.model.util.*;



public abstract class AbstractSQLPaginaDAO implements SQLPaginaDAO {
    
    public abstract PaginaDTO create(Connection connection, PaginaDTO paginaDTO) 
    throws DuplicateInstanceException, InternalErrorException;
    
    public boolean exists(Connection connection, String nickName) 
        throws InternalErrorException
    {
     
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        
        
        try
        {
            String queryString = "SELECT idPagina FROM Pagina" + " WHERE nickName = ?";
            
            preparedStatement = connection.prepareStatement(queryString);
            
            int i=1;
            
            preparedStatement.setString(i++,nickName);
            
            resultSet =preparedStatement.executeQuery();
            
           return resultSet.next();
            
         }catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }
    public PaginaDTO find(Connection connection, String nickName)
     throws InstanceNotFoundException, InternalErrorException 
    {
        PreparedStatement preparedStatement = null;
        ResultSet resultSet=null;
        
         try
        {
            
            //Cogemos la pagina dado un nickName
            String queryString = "SELECT idPagina,numnoticias" + " FROM Pagina" + 
                    " WHERE nickname=?";
            
            
            
            preparedStatement = connection.prepareStatement(queryString);
            int i=1;
            preparedStatement.setString(i++,nickName);
            
            resultSet = preparedStatement.executeQuery();
            
            if (!resultSet.next()) {
               throw new InstanceNotFoundException(nickName,PaginaDTO.class.getName());
            }
            
            /* Get results. */
            i = 1;
            Long idPagina = resultSet.getLong(i++);
            int numNoticias = resultSet.getInt(i++);
            PaginaDTO paginaDTO = new PaginaDTO(idPagina,nickName,numNoticias);
            
            
            //Cogemos las id de noticias para meterlas en una lista
            
            i=1;
            
            queryString = "SELECT idNoticia FROM Noticia ORDER BY fecha DESC"; 
            
            preparedStatement = connection.prepareStatement(queryString);
            
            resultSet = preparedStatement.executeQuery();
            int cont=0;
            
            while(resultSet.next() && cont < paginaDTO.getNumNoticias())
            {   
                paginaDTO.getNoticias().add(resultSet.getLong("idNoticia"));
                cont++;
            }
            
            //Cogemos los idmarcadores de la PaginaToMarcador
            
             queryString = "SELECT idMarcador FROM PaginaToMarcador WHERE idPagina=? "; 
            
            preparedStatement = connection.prepareStatement(queryString);
            i=1;
            preparedStatement.setLong(i++,idPagina);
            
            resultSet = preparedStatement.executeQuery();
            
            while(resultSet.next())
            {   
                paginaDTO.getMarcadores().add(resultSet.getLong("idMarcador"));
                
            }
            
            //Cogemos los indices de la Pagina....
            
             queryString = "SELECT idIndice FROM PaginaToIndiceBursatil where idPagina =?";
            
            preparedStatement = connection.prepareStatement(queryString);
            i=1;
            preparedStatement.setLong(i++,idPagina);
            
            resultSet = preparedStatement.executeQuery();
            
            while(resultSet.next())
            {   
                paginaDTO.getIndicesBursatiles().add(resultSet.getLong("idIndice"));
                
            }
            
            queryString = "SELECT idConsejo FROM Consejo";
            
            preparedStatement = connection.prepareStatement(queryString);
            
            resultSet = preparedStatement.executeQuery();
            
            //Para obtener el numero de filas nos situamos en el utlimo y obtenemos su fila
            resultSet.last();
            int size = resultSet.getRow();
            int numeroAleatorio = (int) (Math.random()*size+1);
            
            if(!resultSet.absolute(numeroAleatorio))
            {
               throw new InstanceNotFoundException(idPagina,PaginaDTO.class.getName()); 
            }  
            
            paginaDTO.setConsejo(resultSet.getLong("idConsejo"));
            
            return paginaDTO;
            
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }    
        
        
    }
    public void update(Connection connection, PaginaDTO paginaDTO) 
        throws InstanceNotFoundException, InternalErrorException{
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
     
        try
        {
            //Primero borrar los Marcadores de la tabla N-M
            String queryString = "DELETE FROM PaginaToMarcador"
                    + " WHERE idPagina=?";
            
            preparedStatement = connection.prepareStatement(queryString);
            int i=1;
            
            preparedStatement.setLong(i++,paginaDTO.getIdPagina());
            
            int updateRows = preparedStatement.executeUpdate();
            
            //Incorporar los idPagina y idMarcador de toda la lista
            for(int j=0; j<paginaDTO.getMarcadores().size();j++){
                queryString = "insert into PaginaToMarcador " +
                        "(idPagina,idMarcador) VALUES(?, ?)";
            
                preparedStatement = connection.prepareStatement(queryString);
                i=1;
                
                preparedStatement.setLong(i++,paginaDTO.getIdPagina());
                preparedStatement.setLong(i++,paginaDTO.getMarcadores().get(j));
                /* Execute query. */
                int updatedRows = preparedStatement.executeUpdate();

                if (updatedRows == 0) {
                    throw new InstanceNotFoundException(
                        paginaDTO.getIdPagina(), 
                        PaginaDTO.class.getName());
                }
            }
            
            //Primero borrar los IndicesBursatiles de la tabla N-M
            queryString = "DELETE FROM PaginaToIndiceBursatil"
                    + " WHERE idPagina=?";
            
            preparedStatement = connection.prepareStatement(queryString);
            i=1;
            
            preparedStatement.setLong(i++,paginaDTO.getIdPagina());
            
            updateRows = preparedStatement.executeUpdate();
            
            
            //Incorporar los idPagina y idIndice de toda la lista
            for(int j=0; j<paginaDTO.getIndicesBursatiles().size();j++){
                queryString = "insert into PaginaToIndiceBursatil " +
                        "(idPagina,idIndice) VALUES(?, ?)";
            
                preparedStatement = connection.prepareStatement(queryString);
                i=1;
                
                preparedStatement.setLong(i++,paginaDTO.getIdPagina());
                preparedStatement.setLong(i++,paginaDTO.getIndicesBursatiles().get(j));
                /* Execute query. */
                int updatedRows = preparedStatement.executeUpdate();

                if (updatedRows == 0) {
                    throw new InstanceNotFoundException(
                        paginaDTO.getIdPagina(), 
                        PaginaDTO.class.getName());
                }
            }
            

            /* Actializo el numero de noticias*/
            /* Create "preparedStatement". */
            queryString = "UPDATE Pagina SET numNoticias = ?" +
                " WHERE idPagina = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */
            i = 1;
            preparedStatement.setInt(i++, paginaDTO.getNumNoticias());
            preparedStatement.setLong(i++, paginaDTO.getIdPagina());
            
            /* Execute query. */
            int updatedRows = preparedStatement.executeUpdate();

            if (updatedRows == 0) {
                throw new InstanceNotFoundException(
                    paginaDTO.getIdPagina(), 
                    PaginaDTO.class.getName());
            }

            if (updatedRows > 1) {
                throw new SQLException("Duplicate row for idPagina = '" + 
                    paginaDTO.getIdPagina() + "' in table 'Pagina'");
            }  
            
        }catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
        }           
       
        
        
    }
    public void remove(Connection connection, Long id)
         throws InstanceNotFoundException, InternalErrorException
    {
         PreparedStatement preparedStatement = null;
         
         try
         {
            String queryString = "DELETE FROM Pagina WHERE" +
                " idPagina = ?";
            
            
            preparedStatement = connection.prepareStatement(queryString);
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setLong(i++,id);
            
            int removedRows = preparedStatement.executeUpdate();
            
            if(removedRows==0)
            {
                throw new InstanceNotFoundException(id, PaginaDTO.class.getName());
            }
            
            queryString = "DELETE FROM PaginaToMarcador WHERE" +
                " idPagina = ?";
            
            
            preparedStatement = connection.prepareStatement(queryString);
            /* Fill "preparedStatement". */
            i = 1;
            preparedStatement.setLong(i++,id);
            
            removedRows = preparedStatement.executeUpdate();
            //Si no hay ninguna relacion entre marcador y pagina no pasa nada
            
            queryString = "DELETE FROM PaginaToIndiceBursatil WHERE" +
                " idPagina = ?";
            
            
            preparedStatement = connection.prepareStatement(queryString);
            /* Fill "preparedStatement". */
            i = 1;
            preparedStatement.setLong(i++,id);
            
            removedRows = preparedStatement.executeUpdate();
            //Si no hay ninguna relacion entre indiceBursatil y pagina no pasa nada
            
            
          }catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
        }    
    }
}
